package edu.asselvi.seguros.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import edu.asselvi.seguros.db.ConnectionFactory;
import edu.asselvi.seguros.db.DbUtils;
import edu.asselvi.seguros.exception.ESegurosErros;
import edu.asselvi.seguros.exception.SegurosException;
import edu.asselvi.seguros.pojo.Modelo;


public class ModeloDao extends DbUtils {

	Connection conn;

	public ModeloDao(Connection conn) {
		this.conn = conn; 
	}
	
	public ModeloDao() throws SegurosException {
		this.conn = new ConnectionFactory().getConnection();
	
	}
	
	
	public Modelo insert(Modelo modelo) throws SegurosException{

		String sql = "INSERT INTO MODELOS (ID_MODELO, DISCRIMINACAO, FK_ID_MARCA) VALUES (?,?,?)";
		PreparedStatement p = null;

		try {
			modelo.setId_modelo(getNextId("SEQ_MODELOS", conn)); 
			
			p = conn.prepareStatement(sql);
			int cont = 1;
			
			p.setInt(cont++, modelo.getId_modelo());
			p.setString(cont++, modelo.getDiscriminacao());
			p.setInt(cont++, modelo.getFk_id_marca());
			

			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_INSERCAO);
			
		} finally {
			close(p);
		}
		return modelo;
	}


	public List<Modelo> list() throws SQLException, SegurosException {

		String sql = "SELECT * FROM MODELOS";

		List<Modelo> lista = null;
		PreparedStatement p = null;
		java.sql.ResultSet rs = null;

		try {
			lista = new ArrayList<Modelo>();
			p = conn.prepareStatement(sql);
			
			rs = p.executeQuery();

			while (rs.next()) {
				Modelo modelo = new Modelo();
				modelo.setId_modelo(rs.getInt("ID_MODELO"));
				modelo.setDiscriminacao(rs.getString("DISCRIMINACAO"));
				modelo.setFk_id_marca(rs.getInt("FK_ID_MARCA"));

				lista.add(modelo);
			}
			if (lista.isEmpty()){
				throw new SegurosException(ESegurosErros.ERRO_ZERO_REGISTROS);
			} 

		} finally {
			close(rs);
			close(p);
		}

		return lista;		
	
	}
	
	
	public List<Modelo> listByMarca(int codMarca) throws SQLException, SegurosException {

		String sql = "SELECT * FROM MODELOS WHERE FK_ID_MARCA = ?";

		List<Modelo> lista = null;
		PreparedStatement p = null;
		java.sql.ResultSet rs = null;

		try {
			lista = new ArrayList<Modelo>();
			p = conn.prepareStatement(sql);
			p.setInt(1, codMarca);
			
			rs = p.executeQuery();

			while (rs.next()) {
				Modelo modelo = new Modelo();
				modelo.setId_modelo(rs.getInt("ID_MODELO"));
				modelo.setDiscriminacao(rs.getString("DISCRIMINACAO"));
				modelo.setFk_id_marca(rs.getInt("FK_ID_MARCA"));

				lista.add(modelo);
			}
			if (lista.isEmpty()){
				throw new SegurosException(ESegurosErros.ERRO_ZERO_REGISTROS);
			} 

		} finally {
			close(rs);
			close(p);
		}

		return lista;		
	
	}
	
	public Modelo getModelo(int id_modelo) throws SegurosException {
		
		String sql = "SELECT * FROM MODELOS WHERE ID_MODELO = ?";
		Modelo modelo = new Modelo();
		PreparedStatement p = null;
		ResultSet rs = null;
		
		try {
			p = conn.prepareStatement(sql);
			p.setInt(1, id_modelo);
			rs = p.executeQuery();

			while (rs.next()) {

				modelo.setId_modelo(rs.getInt("ID_MODELO"));
				modelo.setDiscriminacao(rs.getString("DISCRIMINACAO"));
				modelo.setFk_id_marca(rs.getInt("FK_ID_MARCA"));
				
			}
		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_RECUPERAR_DADOS);
			
		} finally {
			close(p);
			close(rs);
		}
		return modelo;
	}
	

	public void remove(int id_modelo) throws SegurosException {
		
		String sql = "DELETE FROM MODELOS WHERE ID_MODELO = ?";

		PreparedStatement p = null;
		
		try {
			p = conn.prepareStatement(sql);
			p.setInt(1, id_modelo);
			
			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_REMOVER_DADOS);
			
		} finally {
			close(p);
		}
		
	}
	
	public void update (Modelo modelo) throws SQLException {

		String sql = "UPDATE MODELOS SET DISCRIMINACAO = ?, FK_ID_MARCA = ? WHERE ID_MODELO = ?";

		PreparedStatement p = null;
		
		try {
			p = conn.prepareStatement(sql);
			int cont = 1;
			p.setString(cont++, modelo.getDiscriminacao());
			p.setInt(cont++, modelo.getFk_id_marca());
			p.setInt(cont++, modelo.getId_modelo());

			p.executeUpdate();
			p.close();
			conn.close();

		} finally {
			close(p);
		}
		
	}
	
}
